package com.aaie.gru.util;

import com.aaie.gru.login.entity.LoginUser;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class CommonUtil {

    public static final String FORMAT = "dd/MM/YYYY";

    public static final String FORMAT_US = "dd/MM/YYYY HH:mm:ss";

    /**
     * 生成日期字符串
     * @return
     */
    public static String generateLocalDateTime() {
        LocalDateTime localDateTime = LocalDateTime.now();
        return localDateTime.format(DateTimeFormatter.ofPattern(FORMAT));
    }

    public static String generateLocalDateTimeUS() {
        LocalDateTime localDateTime = LocalDateTime.now();
        return localDateTime.format(DateTimeFormatter.ofPattern(FORMAT_US));
    }

    /**
     * 生成时间戳
     * @return
     */
    public static Long generateCurrentTimeMillis() {
        return System.currentTimeMillis();
    }

    public static LoginUser getUser(){
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpSession session = request.getSession();
        LoginUser user = (LoginUser) session.getAttribute("loginUser");
        if (null != user) {
            return user;
        }
        return null;
    }

    /**
     * 从session 中获取 用户对象
     *
     * @param session
     * @return
     */
    public static LoginUser getUser(HttpSession session) {
        return (LoginUser) session.getAttribute("loginUser");
    }

    /**
     * 日期格式字符串转换成时间戳
     * @param date_str 字符串日期
     * @param format 如：yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String date2TimeStamp(String date_str,String format){
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return String.valueOf(sdf.parse(date_str).getTime()/1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 日期格式字符串转换成时间戳
     * @param date_str 字符串日期
     * @return
     */
    public static long date2TimeStamp(String date_str){
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(FORMAT);
            return sdf.parse(date_str).getTime()/1000;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 将图像缩放
     *
     * @param src  源图像路径
     * @param dest 缩放后图像路径
     * @param w    缩放的图像的宽
     * @param h    缩放的图像的高
     * @throws Exception
     */
    public static void zoomImage(String src, String dest, int w, int h) throws Exception {
        double wr = 0, hr = 0;
        File srcFile = new File(src);
        File destFile = new File(dest);
        BufferedImage bufImg = ImageIO.read(srcFile);

        /*
         * w - 将图像缩放到的宽度。
         *    h - 将图像缩放到的高度。
         *    bufImg.SCALE_SMOOTH - 指示用于图像重新取样的算法类型的标志。选择图像平滑度比缩放速度具有更高优先级的图像缩放算法
         */
        Image Itemp = bufImg.getScaledInstance(w, h, bufImg.SCALE_SMOOTH);

        //获得缩放比例值
        wr = w * 1.0 / bufImg.getWidth();
        hr = h * 1.0 / bufImg.getHeight();

        /*
         * 此类使用仿射转换来执行从源图像或 Raster 中 2D 坐标到目标图像或 Raster 中 2D 坐标的线性映射。
         * 参数：AffineTransform.getScaleInstance(wr, hr)表示缩放变换的变换矩阵，矩阵为：
         *         -----   [   sx   0    0   ]   -----
         *          -----    [   0    sy   0   ]   -----
         *          -----    [   0    0    1   ]   -----
         */
        AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null);

        /*
         * 转换源 BufferedImage 并将结果存储在目标 BufferedImage 中。
         * 参数一：要转换的BufferedImage
         * 参数二：要在其中存储转换结果的BufferedImage。
         * 返回值：过滤后的BuffereedImage
         */
        Itemp = ato.filter(bufImg, null);

        try {
            //写入图片。
            ImageIO.write((BufferedImage) Itemp, dest.substring(dest.lastIndexOf(".") + 1), destFile);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
